package com.atlin.project.manager;

import io.github.briqt.spark4j.SparkClient;
import io.github.briqt.spark4j.constant.SparkApiVersion;
import io.github.briqt.spark4j.exception.SparkException;
import io.github.briqt.spark4j.model.SparkMessage;
import io.github.briqt.spark4j.model.SparkSyncChatResponse;
import io.github.briqt.spark4j.model.request.SparkRequest;
import io.github.briqt.spark4j.model.response.SparkTextUsage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @author atlin
 * @description 讯飞星火AI服务能力
 * @createDate 2024/11/13 16:55
 */
@Service
@Slf4j
public class AiManager {

    @Resource
    SparkClient sparkClient;

    
    public String sendMsgToSpark(boolean isNeedTemplate, String content) {
        SparkSyncChatResponse sparkSyncChatResponse = sendMsgToSparkAndCount(isNeedTemplate, content);
        if (sparkSyncChatResponse == null) return "";
        return sparkSyncChatResponse.getContent();
    }

    public SparkSyncChatResponse sendMsgToSparkAndCount(boolean isNeedTemplate, String content) {
        List<SparkMessage> messages = new ArrayList<>();
        if (isNeedTemplate) {
            messages.add(SparkMessage.systemContent("你是一个数据分析师和前端开发专家，接下来我会按照以下固定格式给你提供内容： \n" +
                    "目标: {数据分析的需求或者目标} \n" +
                    "数据: {csv格式的原始数据，用,作为分隔符} \n" +
                    "请根据这两部分内容，严格按照以下指定格式生成内容（此外不要输出任何多余的开头、结尾、注释）同时不要使用这个符号 '】' \n" +
                    "【【【【【\n" +
                    "{前端 Echarts V5 的 option 配置对象 JSON 代码,确保能够正确运行 不要生成任何多余的内容，比如注释和代码块标记} \n" +
                    "【【【【【\n" +
                    "{明确的数据分析结论、越详细越好，不要生成多余的注释}  \n" +
                    "下面是一个具体的例子的模板： \n" +
                    "【【【【【 \n" +
                    "JSON格式代码 \n" +
                    "【【【【【\n" +
                    "分析结论"));
        }

        messages.add(SparkMessage.userContent(content));
        // 构造请求
        SparkRequest sparkRequest = SparkRequest.builder()
                // 消息列表
                .messages(messages)
                // 模型回答的tokens的最大长度,非必传，默认为2048。
                // V1.5取值为[1,4096]
                // V2.0取值为[1,8192]
                // V3.0取值为[1,8192]
                .maxTokens(2048)
                // 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高 非必传,取值为[0,1],默认为0.5
                .temperature(0.2)
                .apiVersion(SparkApiVersion.V4_0)
                .build();

        try {
            // 1999243
            //提问tokens：14，回答tokens：285，总消耗tokens：299
            // 1998944
            // 同步调用
            SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);
            SparkTextUsage textUsage = chatResponse.getTextUsage();
            String result = chatResponse.getContent();

            log.info("星火 AI 返回的结果 {}", result);
            // 统计 
            Integer promptTokens = textUsage.getPromptTokens();
            Integer completionTokens = textUsage.getCompletionTokens();
            Integer totalTokens = textUsage.getTotalTokens();

            log.info(" 提问tokens：{}，回答tokens：{}，总消耗tokens：{}。", promptTokens, completionTokens, totalTokens);

            return chatResponse;
        } catch (SparkException e) {
            log.error("AI服务调用发生异常：" + e.getMessage());
        }
        return null;
    }

}
